package com.sdstc.modules.uitl;

import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.NoSuchElementException;

public class ExcelUtils {

    /**
     * excel 导入
     *
     * @param file      excel文件
     * @param pojoClass pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException {
        return importExcel(file, 0, 1, pojoClass);
    }

    public static <T> List<T> importExcel(MultipartFile file,Integer startSheetIndex,Class<T> pojoClass) throws IOException {
        return importExcel(file, 0, 1, startSheetIndex,pojoClass);
    }

    public static <T> List<T> importExcelBySheetNum(MultipartFile file,Integer sheetNum,Class<T> pojoClass) throws IOException {
        return importExcelBySheetNum(file, 0, 1, sheetNum,pojoClass);
    }



    /**
     * excel 导入
     *
     * @param filePath   excel文件路径
     * @param titleRows  表格内数据标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        if (StringUtils.isBlank(filePath)) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setNeedSave(true);
        params.setSaveUrl("/excel/");
        try {
            return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("模板不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param file       上传的文件
     * @param titleRows  表格内数据标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        if (file == null) {
            return null;
        }
        try {
            return importExcel(file.getInputStream(), titleRows, headerRows, pojoClass);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入(多个sheet)
     *
     * @param file          上传的文件
     * @param titleRows     表格内数据标题行
     * @param headerRows    表头行
     * @param startSheetIndex      sheet工作表数量
     * @param pojoClass     pojo类型
     * @param <T>
     * @return
     * @throws IOException
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows,Integer startSheetIndex, Class<T> pojoClass) throws IOException {
        if (file == null) {
            return null;
        }
        try {
            return importExcel(file.getInputStream(), titleRows, headerRows,startSheetIndex, pojoClass);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入(一次性导入全部sheet页)
     *
     * @param file          上传的文件
     * @param titleRows     表格内数据标题行
     * @param headerRows    表头行
     * @param sheetNum      sheet工作表数量
     * @param pojoClass     pojo类型
     * @param <T>
     * @return
     * @throws IOException
     */
    public static <T> List<T> importExcelBySheetNum(MultipartFile file, Integer titleRows, Integer headerRows,Integer sheetNum, Class<T> pojoClass) throws IOException {
        if (file == null) {
            return null;
        }
        try {
            return importExcelBySheetNum(file.getInputStream(), titleRows, headerRows,sheetNum, pojoClass);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param inputStream 文件输入流
     * @param titleRows   表格内数据标题行
     * @param headerRows  表头行
     * @param pojoClass   pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows,Class<T> pojoClass) throws IOException {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setSaveUrl("/excel/");
        params.setNeedSave(true);
        try {
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }


    /**
     * excel 导入(多个sheet)
     *
     * @param inputStream   文件输入流
     * @param titleRows     表格内数据标题行
     * @param headerRows    表头行
     * @param startSheetIndex      sheet工作表数量
     * @param pojoClass     pojo类型
     * @param <T>
     * @return
     * @throws IOException
     */
    public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows,Integer startSheetIndex,  Class<T> pojoClass) throws IOException {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setSaveUrl("/excel/");
        params.setNeedSave(true);
        params.setStartSheetIndex(startSheetIndex);
        try {
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

        /**
         * excel 导入(一次性导入全部sheet页)
         *
         * @param inputStream   文件输入流
         * @param titleRows     表格内数据标题行
         * @param headerRows    表头行
         * @param sheetNum      sheet工作表数量
         * @param pojoClass     pojo类型
         * @param <T>
         * @return
         * @throws IOException
         */
        public static <T> List<T> importExcelBySheetNum(InputStream inputStream, Integer titleRows, Integer headerRows,Integer sheetNum,  Class<T> pojoClass) throws IOException {
            if (inputStream == null) {
                return null;
            }
            ImportParams params = new ImportParams();
            params.setTitleRows(titleRows);
            params.setHeadRows(headerRows);
            params.setSaveUrl("/excel/");
            params.setNeedSave(true);
            params.setSheetNum(sheetNum);
            try {
                return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
            } catch (NoSuchElementException e) {
                throw new IOException("excel文件不能为空");
            } catch (Exception e) {
                throw new IOException(e.getMessage());
            }
        }
}
